package study.activiti.i_start;

import java.io.InputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

/**  
 * @Name: StartTest
 * @Description: 启动节点测试类
 * @Author: 李超
 * @Create Date: 2016-12-15
 */
public class StartTest {
	
	//流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
	
	/**  
	* @Name: testStart（方法的名称）
	* @Description: 开始活动节点（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-15 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void testStart() {
		//1、部署流程定义
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("start.bpmn") ; 
		InputStream inputStreamPng = this.getClass().getResourceAsStream("start.png") ; 
		Deployment deployment = processEngine.getRepositoryService()
					 .createDeployment()
					 .name("开始活动节点")
					 .addInputStream("start.bpmn", inputStreamBpmn)
					 .addInputStream("start.png", inputStreamPng)
					 .deploy() ; //发布流程定义
		System.out.println("部署流程定义");
		System.out.println("部署id:" + deployment.getId());
		System.out.println("部署名称:" + deployment.getName());
		System.out.println("部署时间:" + deployment.getDeploymentTime());
		System.out.println("######################################");
		//2、启动流程实例
		String processDefinitionKey = "start" ;
		ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey) ;
		System.out.println("启动流程实例");
		System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
		System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
		System.out.println("#######################################");
		//3、查询正在执行的流程实例，判断流程是否结束：当流程执行结束后，流程实例被删除，运行时执行对象不能被查询
		processInstance = processEngine.getRuntimeService()
					 .createProcessInstanceQuery()
					 .processInstanceId(processInstance.getProcessInstanceId())
					 .singleResult() ;
		System.out.println("查询正在执行的流程实例");
		if(processInstance != null) {
			System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
		} else { //流程执行结束
			System.out.println("流程执行结束，流程实例被删除，运行时执行对象不能被查询");
			//4、查询历史流程实例
			HistoricProcessInstance hpi = processEngine.getHistoryService()
					.createHistoricProcessInstanceQuery()
					.processInstanceId(processInstance.getProcessInstanceId())
					.singleResult() ;
			System.out.println("查询历史流程实例");
			System.out.println("流程实例id:" + hpi.getId());
			System.out.println("#########################################");
		}
	}

}






